var common = require('../../lib/common.js');
var url = require('../../config/url.js');

/**
 * 生成一条聊天室的消息的唯一 ID
 */
function msgUuid() {
    if (!msgUuid.next) {
        msgUuid.next = 0;
    }
    return 'msg-' + (++msgUuid.next);
}

/**
 * 生成聊天室的系统消息
 */
function createSystemMessage(content) {
    return { id: msgUuid(), type: 'system', content: content };
}

/**
 * 生成聊天室的聊天消息
 */
function createUserMessage(content, user, isMe) {
    return { id: msgUuid(), type: 'speak', content: content, user: user, isMe: isMe };
}

// 声明聊天室页面
Page({

    /**
     * 聊天室使用到的数据，主要是消息集合以及当前输入框的文本
     */
    data: {
        userid: 0,
        username: '',
        messages: [],
        inputContent: '',
        lastMessageId: 'none',
        lastId: 0,
        isShow: false,
    },

    onLoad: function (options) {
        this.setData({
            userid: options.userid,
            username: options.username,
        });
        wx.setNavigationBarTitle({ title: options.username });
        this.getNewMessage();
    },

    /**
     * 页面渲染完成后
     * */
    onReady: function () {

    },

    /**
     * 后续后台切换回前台的时候
     */
    onShow: function () {
        this.setData({ isShow: true });
    },

    /**
     * 页面卸载
     */
    onUnload: function () {
        this.setData({ isShow: false });
    },

    /**
     * 页面切换到后台运行时
     */
    onHide: function () {
        this.setData({ isShow: false });
    },

    /**
     * 通用更新当前消息集合的方法
     */
    updateMessages: function (updater) {
        var messages = this.data.messages;
        updater(messages);

        this.setData({ messages: messages });

        // 需要先更新 messagess 数据后再设置滚动位置，否则不能生效
        var lastMessageId = messages.length ? messages[messages.length - 1].id : 'none';
        this.setData({ lastMessageId: lastMessageId });
    },

    /**
     * 追加一条消息
     */
    pushMessage: function (message) {
        this.updateMessages(function (messages) {
            messages.push(message);
        });
    },

    /**
     * 替换上一条消息
     */
    amendMessage: function (message) {
        this.updateMessages(function (messages) {
            messages = messages.splice(-1, 1, message)
        });
    },

    /**
     * 删除上一条消息
     */
    popMessage: function () {
        this.updateMessages(function (messages) {
            messages = messages.pop()
        });
    },

    /**
     * 用户输入的内容改变之后
     */
    changeInputContent: function (e) {
        this.setData({ inputContent: e.detail.value });
    },
    // 留言
    sendMessage: function () {
        if (this.data.inputContent == '') {
            return;
        }
        common.post(url.sendChat, { user_id: this.data.userid, msg: this.data.inputContent }, () => {
        });

        this.setData({ inputContent: '' });
    },

    // 获取未读留言
    getNewMessage: function () {
        var params = {
            user_id: this.data.userid,
            last_id: this.data.lastId
        };

        common.post(url.getChatList, params, (data) => {
            if (data.length > 0) {
                this.updateMessages((messages) => {
                    for (var i = data.length - 1; i >= 0; i--) {
                        var who = {
                            avatarUrl: data[i].avatar_url,
                            nickName: data[i].username
                        };
                        var message = createUserMessage(data[i].msg, who, data[i].is_me);
                        messages.push(message);
                    }
                    if (data.length) {
                        this.setData({
                            lastId: data[0].id
                        });
                    }
                });
            }

            if (this.data.isShow) {
                setTimeout(() => {
                    this.getNewMessage();
                }, 500);
            }
        });
    }

});